home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
Random2.0
/
Source
/
Gaussian.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
2KB
|
144 lines
//
// Gaussian
//
// Copyright (C) 1992 Contemporary Design Studios. All rights reserved.
//
#import "Gaussian.h"
#import <math.h>
#import <stdio.h>
@implementation Gaussian
//
// init
//
- initEngineInstance:anObject
{
[super initEngineInstance:anObject];
iset = 0; // No saved gaussian yet.
gset = 0.0;
gscale = 1.0;
gorigin = 0.0;
return self;
}
//
// gScale
//
- (double)gScale
{
return gscale;
}
//
// setGScale:
//
- setGScale:(double)aScale
{
gscale = aScale;
return self;
}
//
// gOrigin
//
- (double)gOrigin
{
return gorigin;
}
//
// setGOrigin:
//
- setGOrigin:(double)anOrigin
{
gorigin = anOrigin;
return self;
}
//
// gaussian
//
- (double)gaussian
{
double fac, r, temp;
volatile double v1, v2; // Prevent compiler warning about un-init.
if(iset == 0) { // If none stored, calculate a pair.
do { // Find a pair which are inside unit circle.
v1 = 2.0 * [self percent] - 1.0;
v2 = 2.0 * [self percent] - 1.0;
r = (v1 * v1) + (v2 * v2);
} while((r >= 1.0) || (r == 0.0));
fac = sqrt(-2.0 * log(r) / r); // Do Box-Muller transformation.
gset = v1 * fac;
iset = 1;
temp = v2 * fac; // Return one of the pair.
// printf("Gaussian: New value = %f, new stored value = %f\n", temp, gset);
}
else { // Otherwise return stored one.
iset = 0;
temp = gset;
}
return ((temp * gscale) + gorigin); // Modify the variable.
}
//
// read:
//
- read:(NXTypedStream *)stream
{
[super read:stream];
NXReadTypes(stream, "iddd", &iset, &gset, &gscale, &gorigin);
return self;
}
//
// write:
//
- write:(NXTypedStream *)stream
{
[super write:stream];
NXWriteTypes(stream, "iddd", &iset, &gset, &gscale, &gorigin);
return self;
}
@end
//
// End of file.
//